﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace AlgorithmTest
{
    // T_[四个数字排序]_[算法名]
    public class T_0071_FindCircleNum : IAlgorithm
    {
        // 547. 省份数量

        // 有 n 个城市，其中一些彼此相连，另一些没有相连。如果城市 a 与城市 b 直接相连，且城市 b 与城市 c 直接相连，那么城市 a 与城市 c 间接相连。
        // 省份 是一组直接或间接相连的城市，组内不含其他没有相连的城市。
        // 给你一个 n x n 的矩阵 isConnected ，其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连，而 isConnected[i][j] = 0 表示二者不直接相连。
        // 返回矩阵中 省份 的数量。

        // 提示：
        //  1 <= n <= 200
        //  n == isConnected.length
        //  n == isConnected[i].length
        //  isConnected[i][j] 为 1 或 0
        //  isConnected[i][i] == 1
        //  isConnected[i][j] == isConnected[j][i]

        public void Test()
        {
            // 算法参数定义

            // 算法执行与打印
            //Console.WriteLine(FindCircleNum(isConnected));
        }

        // 算法
        public int FindCircleNum(int[][] isConnected)
        {
            int provinces = isConnected.Length ;
            bool[] visited = new bool[provinces];
            int circles = 0;
            for (int i = 0; i < provinces; i++)
            {
                if (!visited[i])
                {
                    Dfs(isConnected, visited, provinces, i);
                    circles++;
                }
            }
            return circles;
        }
        public void Dfs(int[][] isConnected, bool[] visited, int provinces, int i)
        {
            for (int j = 0; j < provinces; j++)
            {
                if (isConnected[i][j] == 1 && !visited[j])
                {
                    visited[j] = true;
                    Dfs(isConnected, visited, provinces, j);
                }
            }
        }
    }
}
